home *** CD-ROM | disk | FTP | other *** search
/ OpenGL Superbible (2nd Edition) / OpenGL SuperBible e2.iso / tools / GLUT-3.7 / PROGS / GLE / TWISTOID.C < prev    next >
Encoding:
C/C++ Source or Header  |  1998-08-12  |  4.5 KB  |  212 lines

  1. /* 
  2.  * twistoid.c
  3.  *
  4.  * FUNCTION:
  5.  * Show extrusion of open contours. Also, show how torsion is applied.
  6.  *
  7.  * HISTORY:
  8.  * -- linas Vepstas October 1991
  9.  * -- heavily modified to draw corrugated surface, Feb 1993, Linas
  10.  * -- modified to demo twistoid March 1993
  11.  * -- port to glut Linas Vepstas March 1995
  12.  */
  13.  
  14. /* required include files */
  15. #include <math.h>
  16. #include <stdlib.h>
  17. #include <GL/glut.h>
  18. #include <GL/tube.h>
  19.  
  20. /* Some <math.h> files do not define M_PI... */
  21. #ifndef M_PI
  22. #define M_PI 3.14159265358979323846
  23. #endif
  24.  
  25. extern float lastx;
  26. extern float lasty;
  27.  
  28. #define OPENGL_10
  29. /* =========================================================== */
  30.  
  31. #define NUM_TOID1_PTS 5
  32. double toid1_points[NUM_TOID1_PTS][3];
  33. float toid1_colors [NUM_TOID1_PTS][3];
  34. double toid1_twists [NUM_TOID1_PTS];
  35.  
  36. #define TSCALE (6.0)
  37.  
  38. #define TPTS(x,y) {                \
  39.    toid1_points[i][0] = TSCALE * (x);        \
  40.    toid1_points[i][1] = TSCALE * (y);        \
  41.    toid1_points[i][2] = TSCALE * (0.0);        \
  42.    i++;                        \
  43. }
  44.  
  45. #define TCOLS(r,g,b) {                \
  46.    toid1_colors[i][0] = (r);            \
  47.    toid1_colors[i][1] = (g);            \
  48.    toid1_colors[i][2] = (b);            \
  49.    i++;                        \
  50. }
  51.  
  52. #define TXZERO() {                \
  53.    toid1_twists[i] = 0.0;            \
  54.    i++;                        \
  55. }
  56.  
  57. void init_toid1_line (void)
  58. {
  59.    int i;
  60.  
  61.    i=0;
  62.    TPTS (-1.1, 0.0);
  63.    TPTS (-1.0, 0.0);
  64.    TPTS (0.0, 0.0);
  65.    TPTS (1.0, 0.0);
  66.    TPTS (1.1, 0.0);
  67.  
  68.    i=0;
  69.    TCOLS (0.8, 0.8, 0.5);
  70.    TCOLS (0.8, 0.4, 0.5);
  71.    TCOLS (0.8, 0.8, 0.3);
  72.    TCOLS (0.4, 0.4, 0.5);
  73.    TCOLS (0.8, 0.8, 0.5);
  74.  
  75.    i=0;
  76.    TXZERO ();
  77.    TXZERO ();
  78.    TXZERO ();
  79.    TXZERO ();
  80.    TXZERO ();
  81. }
  82.  
  83. /* =========================================================== */
  84.  
  85. #define SCALE 0.6
  86. #define TWIST(x,y) {                        \
  87.    double ax, ay, alen;                        \
  88.    twistation[i][0] = SCALE * (x);                \
  89.    twistation[i][1] = SCALE * (y);                \
  90.    if (i!=0) {                            \
  91.       ax = twistation[i][0] - twistation[i-1][0];        \
  92.       ay = twistation[i][1] - twistation[i-1][1];        \
  93.       alen = 1.0 / sqrt (ax*ax + ay*ay);            \
  94.       ax *= alen;   ay *= alen;                    \
  95.       twist_normal [i-1][0] = - ay;                \
  96.       twist_normal [i-1][1] = ax;                \
  97.    }                                \
  98.    i++;                                \
  99. }
  100.  
  101. #define NUM_TWIS_PTS (20)
  102.  
  103. double twistation [NUM_TWIS_PTS][2];
  104. double twist_normal [NUM_TWIS_PTS][2];
  105.  
  106. void init_tripples (void)
  107. {
  108.    int i;
  109.    double angle;
  110.    double co, si;
  111.  
  112.    /* outline of extrusion */
  113.    i=0;
  114.    /* first, draw a semi-curcular "hump" */
  115.    while (i< 11) {
  116.       angle = M_PI * ((double) i) / 10.0;
  117.       co = cos (angle);
  118.       si = sin (angle);
  119.       TWIST ((-7.0 -3.0*co), 1.8*si);
  120.    }
  121.  
  122.    /* now, a zig-zag corrugation */
  123.    while (i< NUM_TWIS_PTS) {
  124.       TWIST ((-10.0 +(double) i), 0.0);
  125.       TWIST ((-9.5 +(double) i), 1.0);
  126.    }
  127. }
  128.  
  129.    
  130. /* =========================================================== */
  131.  
  132. #define V3F(x,y,z) {                    \
  133.     float vvv[3];                     \
  134.     vvv[0] = x; vvv[1] = y; vvv[2] = z; v3f (vvv);     \
  135. }
  136.  
  137. #define N3F(x,y,z) {                    \
  138.     float nnn[3];                     \
  139.     nnn[0] = x; nnn[1] = y; nnn[2] = z; n3f (nnn);     \
  140. }
  141.  
  142. /* =========================================================== */
  143.  
  144. void DrawStuff (void) {
  145.    int i;
  146.  
  147.    toid1_twists[2] = (lastx-121.0) / 8.0;
  148.  
  149.    i=3;
  150. /*
  151.    TPTS (1.0, lasty /400.0);
  152.    TPTS (1.1, 1.1 * lasty / 400.0);
  153. */
  154.    TPTS (1.0, -(lasty-121.0) /200.0);
  155.    TPTS (1.1, -1.1 * (lasty-121.0) / 200.0);
  156.  
  157. #ifdef IBM_GL_32
  158.    rotate (230, 'x');
  159.    rotate (230, 'y');
  160.    scale (1.8, 1.8, 1.8);
  161.  
  162.    if (mono_color) {
  163.       RGBcolor (178, 178, 204);
  164.       twist_extrusion (NUM_TWIS_PTS, twistation, twist_normal, 
  165.                 NULL, NUM_TOID1_PTS, toid1_points, NULL, toid1_twists);
  166.    } else {
  167.       twist_extrusion (NUM_TWIS_PTS, twistation, twist_normal, 
  168.               NULL, NUM_TOID1_PTS, toid1_points, toid1_colors, toid1_twists);
  169.    }
  170. #endif
  171.  
  172. #ifdef OPENGL_10
  173.    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  174.  
  175.    /* set up some matrices so that the object spins with the mouse */
  176.    glPushMatrix ();
  177.    glTranslatef (0.0, 0.0, -80.0);
  178.    glRotated (43.0, 1.0, 0.0, 0.0);
  179.    glRotated (43.0, 0.0, 1.0, 0.0);
  180.    glScaled (1.8, 1.8, 1.8);
  181.    gleTwistExtrusion (NUM_TWIS_PTS, twistation, twist_normal, 
  182.               NULL, NUM_TOID1_PTS, toid1_points, NULL, toid1_twists);
  183.    glPopMatrix ();
  184.    glutSwapBuffers ();
  185. #endif
  186.  
  187. }
  188.  
  189. /* =========================================================== */
  190.  
  191. void InitStuff (void) {
  192.    int js;
  193.  
  194.    init_toid1_line ();
  195.    init_tripples ();
  196.  
  197. #ifdef IBM_GL_32
  198.    js = getjoinstyle ();
  199.    js &= ~TUBE_CONTOUR_CLOSED;
  200.    setjoinstyle (js);
  201. #endif
  202.  
  203. #ifdef OPENGL_10
  204.    js = gleGetJoinStyle ();
  205.    js &= ~TUBE_CONTOUR_CLOSED;
  206.    gleSetJoinStyle (js);
  207. #endif
  208.  
  209. }
  210.  
  211. /* ------------------ end of file -------------------- */
  212.